package pzl.com.waitnotify.beans;

/**
 * @author zl.peng
 * @version [1.0, 2016-11-15]
 *          输入线程 想Resource中输入name ,sex , 输出线程从资源中输出，先要完成的任务是：
 *          1.        当input发现Resource中没有数据时，开始输入，输入完成后，叫output来输出。如果发现有数据，就wait();
 *          2.        当output发现Resource中没有数据时，就wait() ；当发现有数据时，就输出，然后，叫醒input来输入数据。
 *          这个问题的关键在于，如何来做到 交替进行。
 */
public class Resource {
    private String name;
    private String sex;
    private boolean hasData = false;

    public synchronized void set(String name, String sex) {

        if (hasData)
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        //设置成员变量
        this.name = name;
        this.sex = sex;
        //设置之后，Resource中有值，将标记该为 true ,
        hasData = true;
        //唤醒output
        this.notify();
    }

    public synchronized void out() {
        if (!hasData)
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        //输出线程将数据输出
        System.out.println(Thread.currentThread().getName() + "|The name is : " + name + " &&  The sex is : " + sex);
        //改变标记，以便输入线程输入数据
        hasData = false;
        //唤醒input，进行数据输入
        this.notify();
    }


}
